/*

Input: 
	> raw structure indicator files from electoral office
		> ltw_2013_stimmbezirke_strukturindikatoren_wahlatlas.csv	[state 2013]
		> btw_2013_wahlbezirke_strukturindikatoren_wahlatlas.csv	[federal 2013]
		> euw_2014_strukturindikatoren_wahlbezirke.csv				[european 2014]
		> btw_2017_wahlbezirke_strukturindikatoren.csv				[federal 2017]
		> euw_2019_strukturindikatoren.xlsx							[european 2019]
		> ltw_2018_strukturindikatoren.xlsx							[state 2018]
		> strukturindikatoren_daten_stimmbezirke.csv				[municipal 2014]
		> baw_2020_Strukturindikatoren.xlsx							[municipal 2020]
	> $tmp/raw_stimmbez_all_elections.dta [election outcomes precinct-level]
	
output file: $tmp/raw_stimmbez_full.dta

Tasks:
	> Read the Strukturindikatoren at precinct level, clean, and append to panel.
	> Merge with election outcomes at precinct level (raw_stimmbez_all_elections)
 
Note:
	* Most struc.indicators are in shares => they are converted to levels to convert them later on
		
*/


*** STEP 1: define program applicable to each file ***

cap program drop clean_strucind
program  clean_strucind
	
	missings dropobs, force
	missings dropvars, force
	
	cap rename wahlbezirk 		stimmbezirk
	cap rename gebietsnummer 	stimmbezirk
	
	tostring stimmbezirk, replace
	drop if stimmbezirk == "Summe"
	
	// assert stimmbezirk (precinct) is numerical only
	gen tmp = real(stimmbezirk)
	assert !missing(tmp)
	drop tmp*
	
* gen Stimmbezirks-ID and strip of 3. digit "zero"	
	replace 	stimmbezirk = "0"+ stimmbezirk if strlen(stimmbezirk) == 4
	replace 	stimmbezirk = substr(stimmbezirk,1,2) +substr(stimmbezirk,4,.)
	destring	stimmbezirk, replace
	lab var		stimmbezirk "Stimmbezirk ID (string) = precinct"
	
	ds stimmbezirk, not
	foreach v in `r(varlist)' {
		 cap replace `v' = subinstr(`v', ",",".",.)
		
	}
	 cap drop svbesch
	 cap drop erwerbs
	 cap drop gebietsart
	 cap drop arbeitslos
	 cap drop algii
* rename
cap {
	rename einwohner_innen_insgesamt			ew_ges
	rename deutsche 							ew_dt
	rename eu_auslaender_innen 					ew_ausl_eu
	rename nicht_eu_auslaender_innen 			ew_ausl_else
	rename einwohner_innen_nach_migrationsh 	ew_mihi
	rename einwohner_innen_mit_familienstan 	ew_ledig
	rename v8 									ew_married
	rename wahlberechtigte_alter_18_bis_24_ 	wb_18t24
	rename wahlberechtigte_alter_25_bis_34_ 	wb_25t34
	rename wahlberechtigte_alter_35_bis_44j 	wb_35t44
	rename wahlberechtigte_alter_45_bis_59_ 	wb_45t59
	rename wahlberechtigte_alter_60_jahre_u 	wb_60plus
	rename einpersonenhaushalte 				hh_sgl
	rename haushalte_mit_kindern 				hh_kids
	rename wohndauer_in_muenchen				avg_dur
}
cap {
	rename einwohner_inneninsgesamt				ew_ges
	rename einwohner_innendeutsche				ew_dt
	rename einwohner_inneneuauslaenderinnen		ew_ausl_eu
	rename einwohner_innennichteuauslaender		ew_ausl_else
	rename einwohner_innenmigrationshinterg		ew_mihi
	rename einwohner_innenfamilienstandledi		ew_ledig
	rename einwohner_innenfamilienstandverh		ew_married
		
	rename wahlberechtigtedeutsche				wb_dt		// EuE-specific
	rename wahlberechtigteeuauslaender_inne 	wb_ausl		// EuE-specific
	
	rename wahlberechtigtealter1824jahre 		wb_18t24
	rename wahlberechtigtealter2534jahre 		wb_25t34
	rename wahlberechtigtealter3544jahre 		wb_35t44
	rename wahlberechtigtealter4559jahre 		wb_45t59
	rename wahlberechtigtealter60jahreundae 	wb_60plus
	rename einpersonenhaushalte 				hh_sgl
	rename haushaltemitkindern 					hh_kids
	rename wohndauerinmuenchen					avg_dur
}
cap {
	rename anzahleinwohner						ew_ges
	rename anteildeutsche						ew_dt
	rename anteileuausländer					ew_ausl_eu
	rename anteilnichteuausländer				ew_ausl_else
	rename anteilmigrationshintergrund			ew_mihi
	rename anteilledige							ew_ledig
	rename anteilverheiratete					ew_married
		
	cap rename anteildeutschew					wb_dt		// EuE-specific
	cap rename anteileuausländerw 				wb_ausl		// EuE-specific
	
	rename anteil1824jährige* 					wb_18t24
	rename anteil2534jährige* 					wb_25t34
	rename anteil3544jährige* 					wb_35t44
	rename anteil4559jährige* 					wb_45t59
	rename anteil60jährigeundältere* 			wb_60plus
	rename anteileinpersonenhaushalten 			hh_sgl
	rename anteilhaushaltemitkindern 			hh_kids
	rename wohndauerinmünchen					avg_dur
}
cap {
	rename einwohnerinneninsgesamt				ew_ges
	rename einwohnerinnendeutsche				ew_dt
	rename einwohnerinneneuausländerinnen		ew_ausl_eu
	rename einwohnerinnennichteuausländerin		ew_ausl_else
	rename einwohnerinnenmigrationshintergr		ew_mihi
	rename einwohnerinnenfamilienstandledig		ew_ledig
	rename einwohnerinnenfamilienstandverhe		ew_married
		
	cap rename wahlberechtigtedeutsche			wb_dt		// EuE-specific
	cap rename wahlberechtigteeuausländerinnen 	wb_ausl		// EuE-specific
	
	rename wahlberechtigtealter1824jahre 		wb_18t24
	rename wahlberechtigtealter2534jahre 		wb_25t34
	rename wahlberechtigtealter3544jahre 		wb_35t44
	rename wahlberechtigtealter4559jahre 		wb_45t59
	rename wahlberechtigtealter60jahreundäl 	wb_60plus
	rename einpersonenhaushalte 				hh_sgl
	rename haushaltemitkindern 					hh_kids
	rename wohndauerinmünchen					avg_dur
}
                                
               
* In some years shares vs. percentages => convert to percentages
	foreach v of varlist ew_* wb_* hh_sgl hh_kids {
		qui su `v'
		replace `v' = 100*`v' if r(max)<= 1
	}
	destring *, replace
end
		


*** STEP 2: Read and clean individual structural indicator files (precinct-level variables) ***

tempfile structurind_ltw2013 structurind_btw2013 structurind_kow2014 structurind_euw2014 ///
			structurind_btw2017 structurind_ltw2018 structurind_euw2019 structurind_kow2020

* 1) SE-13
	import delim "$rawdata/election_office/ltw_2013/ltw_2013_stimmbezirke_strukturindikatoren_wahlatlas.csv", encoding("utf-8")  varnames(1) clear
	// run program
	clean_strucind
	// gen Election ID
	gen wahl = "LTW13"
	// save
	save `structurind_ltw2013'

* 2) FE-13
	import delim "$rawdata/election_office/btw_2013/btw_2013_wahlbezirke_strukturindikatoren_wahlatlas.csv", encoding("utf-8")  varnames(1) clear
	// run program
	clean_strucind
	// gen Election ID
	gen wahl = "BTW13"
	// save
	save `structurind_btw2013'	

* 3) EuE-14
	import delim "$rawdata/election_office/euw_2014/euw_2014_strukturindikatoren_wahlbezirke.csv", encoding("utf-8")  varnames(1) clear
	// run program
	clean_strucind
	// gen Election ID
	gen wahl = "EUW14"
	// save
	save `structurind_euw2014'
	

* 4) FE-17
	import delim "$rawdata/election_office/btw_2017/btw_2017_wahlbezirke_strukturindikatoren.csv", encoding("utf-8")  varnames(1) clear
	// run program
	clean_strucind
	// gen Election ID
	gen wahl = "BTW17"
	// save
	save `structurind_btw2017'
	
* 5) EuE-19
	import excel "$rawdata/election_office/euw_2019/euw_2019_strukturindikatoren.xlsx", clear ///
			  sheet("WahlbezirkeStrukturdaten") case(lower) firstrow
	// run program
	clean_strucind
	drop gebietsartschlüssel svbeschäftigtendichte arbeitslosendichte erwerbsfähigeleistungsberechtig
	// gen Election ID
	gen wahl = "EUW19"
	// save
	save `structurind_euw2019'
	
* 6) SE-18
	import excel "$rawdata/election_office/ltw_2018/ltw_2018_strukturindikatoren.xlsx", clear ///
			  sheet("StimmbezirkeStrukturdaten") case(lower) firstrow
	// run program
	clean_strucind
	drop svbeschäftigtendichte arbeitslosendichte algiiempfängerdichte gebietsartschlüssel
	// gen Election ID
	gen wahl = "LTW18"
	// save
	save `structurind_ltw2018'
	
* 7) ME-14
	import delim "$rawdata/election_office/kommw_2014/strukturindikatoren_daten_stimmbezirke.csv", encoding("utf-8")  varnames(1) clear
	// run program
	clean_strucind
	// gen Election ID
	gen wahl = "KOW14"
	// save
	save `structurind_kow2014'
	
* 8) ME-20
	import excel "$rawdata/election_office/kommw_2020/baw_2020_Strukturindikatoren.xlsx", clear ///
			  sheet("StimmbezirkeStrukturdaten") case(lower) firstrow
	// run program
	clean_strucind
	drop svbeschäftigtendichte arbeitslosendichte erwerbsfähigeleistungsberechtig gebietsartschlüssel
	// gen Election ID
	gen wahl = "KOW20"
	// save
	save `structurind_kow2020'
clear
	
	
*** STEP 3: Append files & MERGE w/ election outcomes ***
	* append
	foreach f in "btw2013" "btw2017" "euw2014" "euw2019" "kow2020" "kow2014" "ltw2013" "ltw2018" {
		append using `structurind_`f''
	}
	lab var wahl 	"Election ID (string)"
		
	drop if stimmbezirk == 16 		// DROP Munich whole city
	drop if stimmbezirk == 9999	// missings
	
	* Impute German/foreigners eligible voters
	replace wb_dt 	= 100 if inlist(substr(wahl,1,3),"BTW", "LTW")
	replace wb_ausl = 0 if inlist(substr(wahl,1,3),"BTW", "LTW")
	
	
* MERGE with election outcomes (note: _merge=1 are redundant precints in FE-17)
	merge 1:1 stimmbezirk wahl using "$tmp/raw_stimmbez_all_elections.dta", assert(1 3)
	assert wahl=="BTW17" if _merge==1
	drop if _merge==1
	drop 	_merge
	
	
/* IMPUTE 2 missing values */ 
	*	FE-13/SE-13 precinct 1717 missing some Strukturvariablen >
	*		> impute district (Stadtbezirk) average vor 2 values
	missings rep *
	cap drop tmp*
	gen tmp_quote = ew_ges/wahlber_gesamt			// impute total inhabitants als multiple of wahlberechtigte
	bys wahl stadtbezirk: egen tmp2 = mean(tmp_quote)
	
	replace ew_ges = floor(tmp2 * wahlber_gesamt) if missing(ew_ges)
	drop tmp*
	
	
	*impute remaining vars (2 values)
	foreach v of varlist wb_18t24 wb_25t34 wb_35t44 wb_45t59 /*wb_60plus*/ avg_dur ew_dt ew_ausl_eu /*ew_ausl_else*/ hh_sgl hh_kids ew_ledig ew_married ew_mihi {
		cap drop tmp*
		bys wahl stadtbezirk: egen tmp = mean(`v')
		replace `v' = tmp if missing(`v') & stimmbezirk == 1717
	}
		replace wb_60plus = 100 - (wb_18t24+ wb_25t34 +wb_35t44 +wb_45t59) if missing(wb_60plus)
		replace ew_ausl_else = 100 - (ew_dt + ew_ausl_eu) if missing(ew_ausl_else)
	
		assert ew_mihi > ew_ausl_else + ew_ausl_eu 
		
*** STEP 4: Replaces values in LEVELS of indicators instead of shares ***

	// Level using #inhabitants
		*->Note: includes hh-level variables
	foreach v of varlist ew_dt ew_mihi ew_ausl* ew_ledig ew_married hh_sgl hh_kids{
		assert inrange(`v',0,100) | `v' == .  				// 1717 in FE/SE 2013 missing ew data
		replace `v' = (`v'/100) * ew_ges
	}

	// Level using #eligible voters
	foreach v of varlist wb_18t24 wb_25t34 wb_35t44 wb_45t59 wb_60plus wb_dt wb_ausl{
		assert inrange(`v',0,100)  | `v' == . 				// 1717 in FE/SE 2013 missing data
		replace `v' = (`v'/100) * wahlber_gesamt
	}
	
	rename stadtbezirk stadtbez
	rename stimmbezirk sb

* save: Panel of precincts x election including election outcomes + structural indicators
	cap drop tmp*
	compress
	isid  sb wahl
	order sb wahl gebietsartschluessel stadtbez
	save "$tmp/raw_stimmbez_full.dta", replace
	
* save a second time for descriptive statistics
	save "$newdata/raw_stimmbez_full.dta", replace
	
